/*设计你的循环队列实现。 循环队列是一种线性数据结构，其操作表现基于 FIFO（先进先出）原则并且队尾被连接在队首之后以形成一个循环。
* 它也被称为“环形缓冲器”。
* 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里，一旦一个队列满了，我们就不能插入下一个元素，即使在队
* 列前面仍有空间。但是使用循环队列，我们能使用这些空间去存储新的值。
*
* 你的实现应该支持如下操作：
* MyCircularQueue(k): 构造器，设置队列长度为 k 。
* Front: 从队首获取元素。如果队列为空，返回 -1 。
* Rear: 获取队尾元素。如果队列为空，返回 -1 。
* enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
* deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
* isEmpty(): 检查循环队列是否为空。
* isFull(): 检查循环队列是否已满。
* */

package newcoder.Queue_4;

import java.util.Arrays;

class MyCircleQueue{

    private int[] queue;
    private int count;
    private int headIndex;
    public MyCircleQueue(int k){
        this.queue = new int[k];
        this.count = 0;
        this.headIndex = 0;
    }

    public boolean enQueue(int value){
        if (this.count == this.queue.length) return false;
        this.queue[(this.headIndex + this.count) % this.queue.length] = value;
        this.count++;
        return true;
    }

    public boolean deQueue(){
        if (this.count == 0) return false;
        this.headIndex = (this.headIndex + 1) % this.queue.length;
        this.count--;
        return true;
    }

    public int Front(){
        if (this.count == 0) return -1;
        return this.queue[this.headIndex];
    }

    public int Rear() {
        if (this.count == 0) return -1;
        return this.queue[(this.headIndex + this.count - 1) % this.queue.length];
    }

    public boolean isEmpty(){
        return this.count == 0;
    }

    public boolean isFull(){
        return this.count == queue.length;
    }
}

public class Leetcode622 {

    public static void main(String[] args) {

        MyCircleQueue obj = new MyCircleQueue(3);
        String[] str = new String[]{"MyCircularQueue","enQueue","enQueue",
                "enQueue","enQueue","Rear","isFull","deQueue","enQueue","Rear"};
        int[][] nums = new int[][]{{3},{1},{2},{3},{4},{},{},{},{4},{}};
        String[] resv = new String[str.length];
        for (int i = 0;i < str.length;i++){
            if (str[i] == "MyCircularQueue"){
                resv[i] = "null";
            }
            if (str[i] == "enQueue"){
                resv[i] = obj.enQueue(nums[i][0]) + "";
            }
            if (str[i] == "deQueue"){
                resv[i] = obj.deQueue() + "";
            }
            if (str[i] == "Front"){
                resv[i] = obj.Front() + "";
            }
            if (str[i] == "Rear"){
                resv[i] = obj.Rear() + "";
            }
            if (str[i] == "isEmpty"){
                resv[i] = obj.isEmpty() + "";
            }
            if (str[i] == "isFull"){
                resv[i] = obj.isFull() + "";
            }
        }
        System.out.println(Arrays.toString(resv));
    }
}
